package com.zhang.crowd.service.impl;

import com.zhang.crowd.entity.po.*;
import com.zhang.crowd.entity.vo.*;
import com.zhang.crowd.mapper.*;
import com.zhang.crowd.service.api.ProjectService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Transactional(readOnly = true)
@Service
public class ProjectServiceImpl implements ProjectService {
    @Autowired
    private ReturnPOMapper returnPOMapper;

    @Autowired
    private MemberConfirmInfoPOMapper memberConfirmInfoPOMapper;

    @Autowired
    private MemberLaunchInfoPOMapper memberLaunchInfoPOMapper;

    @Autowired
    private ProjectPOMapper projectPOMapper;

    @Autowired
    private ProjectItemPicPOMapper projectItemPicPOMapper;

    @Transactional(readOnly = false,propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)
    @Override
    public void saveProject(ProjectVO projectVO, Integer memberId) {

        //保存ProjectPO对象
        //创建空的projectPO对象
        ProjectPO projectPO = new ProjectPO();


        //把projectVO中的属性复制到projectPO中
        BeanUtils.copyProperties(projectVO,projectPO);

        //把memberId设置到projectPO中
        projectPO.setMemberid(memberId);

        //生成创建时间存入
        String createdate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        projectPO.setCreatedate(createdate);

        //status设置为0表示即将开始众筹
        projectPO.setStatus(0);


        //保存projectPO
        //为了能够获取到projectPO保存后的自增主键，需要到ProjectPOMapper.xml文件中进行相关设置
        // <insert id="insertSelective" useGeneratedKeys="true" keyProperty="id"
        projectPOMapper.insertSelective(projectPO);



        //从projectPO对象这里获取自增主键
        Integer projectId = projectPO.getId();



        //保存项目、分类的关联关系信息
        List<Integer> typeIdList = projectVO.getTypeIdList();
        projectPOMapper.insertTypeRelationship(typeIdList,projectId);



        //保存项目、标签的关联关系信息
        List<Integer> tagIdList = projectVO.getTagIdList();
        projectPOMapper.insertTagRelationship(tagIdList,projectId);



        //保存项目中详情图片路径信息
        List<String> detailPicturePathList = projectVO.getDetailPicturePathList();
        projectItemPicPOMapper.insertPathList(projectId,detailPicturePathList);


        //保存项目发起人信息
        MemberLauchInfoVO memberLauchInfoVO = projectVO.getMemberLauchInfoVO();
        MemberLaunchInfoPO memberLaunchInfoPO = new MemberLaunchInfoPO();
        BeanUtils.copyProperties(memberLauchInfoVO,memberLaunchInfoPO);
        memberLaunchInfoPO.setMemberid(memberId);

        memberLaunchInfoPOMapper.insert(memberLaunchInfoPO);

        //保存项目回报信息
        List<ReturnVO> returnVOList = projectVO.getReturnVOList();
        List<ReturnPO> returnPOList = new ArrayList<>();
        for(ReturnVO returnVO : returnVOList){
            ReturnPO returnPO = new ReturnPO();
            BeanUtils.copyProperties(returnVO,returnPO);
            returnPOList.add(returnPO);
        }
        returnPOMapper.insertReturnPOBatch(returnPOList,projectId);


        //保存项目确认信息
        MemberConfirmInfoVO memberConfirmInfoVO = projectVO.getMemberConfirmInfoVO();
        MemberConfirmInfoPO memberConfirmInfoPO = new MemberConfirmInfoPO();
        BeanUtils.copyProperties(memberConfirmInfoVO,memberConfirmInfoPO);
        memberConfirmInfoPO.setMemberid(memberId);

        memberConfirmInfoPOMapper.insert(memberConfirmInfoPO);


    }

    @Override
    public List<PortalTypeVO> getPortalTypeVO() {

        return projectPOMapper.selectPortalTypeVOList();
    }

    @Override
    public DetailProjectVO getDetailProjectVO(Integer projectId) {

        //查询得到DetailProjectVO对象
        DetailProjectVO detailProjectVO = projectPOMapper.selectDetailProjectVO(projectId);

        //根据status确定statusText
        Integer status = detailProjectVO.getStatus();
        switch (status){
            case 0 :
                detailProjectVO.setStatusText("审核中");
            break;
            case 1 :
                detailProjectVO.setStatusText("众筹中");
            break;
            case 2 :
                detailProjectVO.setStatusText("众筹成功");
            break;
            case 3 :
                detailProjectVO.setStatusText("已关闭");
                break;
            default:
                break;
        }

        // 根据deployDate计算lastDay
        String deployDate = detailProjectVO.getDeployDate();

        //获取当前日期
        Date currentDay = new Date();

        //把众筹日期解析成Date类型
        SimpleDateFormat format  = new SimpleDateFormat("yyyy-MM-dd");
        try{
            Date deployDay = format.parse(deployDate);

            //获取当前日期的时间戳
            long currentTimeStamp = currentDay.getTime();

            //获取众筹日期的时间戳
            long deployTimeStamp = deployDay.getTime();

            //两个时间戳相减计算当前已经过去的时间
            long pastDays = (currentTimeStamp - deployTimeStamp) / 1000 / 60 / 60 / 24;

            //获取总的众筹天数
            Integer totalDays = detailProjectVO.getDay();

            //使用总的众筹天数减去已经过去的天数得到剩余天数
            Integer lastDay = (int)(totalDays - pastDays);

            detailProjectVO.setLastDay(lastDay);

        }catch (Exception e){
            e.printStackTrace();
        }



        return detailProjectVO;
    }

}
